package es.indra.malaga.servicios.impl;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.BeanUtils;

import es.indra.malaga.dao.IUsuarioDAO;
import es.indra.malaga.entity.UsuarioBeanDAO;
import es.indra.malaga.servicios.IUsuarioService;
import es.indra.malaga.viewBeans.UsuarioView;

public class UsuarioServiceImpl implements IUsuarioService, Serializable {

	private static final long serialVersionUID = 7855165785971240459L;

	private static String USER_ADMIN = "admin";
	private static String USER_PROFESOR = "profesor";
	private static String USER_ALUMNO = "alumno";

	private IUsuarioDAO usuarioDAO;

	public List<UsuarioView> getUsuarios() {
		List<UsuarioBeanDAO> lUsuariosDAO = usuarioDAO.listarTodos();
		List<UsuarioView> lUsuarios = new ArrayList<UsuarioView>();
		for (UsuarioBeanDAO usuarioBeanDAO : lUsuariosDAO) {
			UsuarioView usuario = new UsuarioView();
			BeanUtils.copyProperties(usuarioBeanDAO, usuario);
			lUsuarios.add(usuario);
		}
		return lUsuarios;
	}

	public UsuarioView getUsuario(Integer idUsuario) {
		UsuarioView usuario = new UsuarioView();
		UsuarioBeanDAO usuarioBeanDAO = usuarioDAO.buscar(idUsuario);
		BeanUtils.copyProperties(usuarioBeanDAO, usuario);
		return usuario;
	}

	public UsuarioView getUsuarioByName(String username) {
		UsuarioView usuario = null;
		List<UsuarioBeanDAO> lUsuarios = usuarioDAO.getUsuarioByName(username);
		if (lUsuarios != null) {
			usuario = new UsuarioView();
			BeanUtils.copyProperties(lUsuarios.iterator().next(), usuario);
		}
		return usuario;
	}

	public boolean guardarUsuario(UsuarioView usuario) {
		if (usuario != null && usuario.getUsername() != null) {
			UsuarioBeanDAO usuarioBeanDAO = new UsuarioBeanDAO();
			BeanUtils.copyProperties(usuario, usuarioBeanDAO);
			usuarioBeanDAO.setFechaAlta(new SimpleDateFormat("dd/MM/yyyy")
					.format(new Date()));
			usuarioDAO.insertar(usuarioBeanDAO);
			return true;
		}
		return false;
	}

	public boolean modificarUsuario(UsuarioView usuario) {
		List<UsuarioBeanDAO> lUsuariosFound = usuarioDAO
				.getUsuarioByName(usuario.getUsername());
		if (lUsuariosFound.size() == 1) {
			UsuarioBeanDAO usuarioBeanDAO = lUsuariosFound.iterator().next();
			usuarioBeanDAO.setPassword(usuario.getPassword());
			usuarioBeanDAO.setEstado(usuario.getEstado());
			usuarioBeanDAO.setRol(usuario.getRol());
			if (usuario.getEstado().equalsIgnoreCase("INACTIVO")) {
				usuarioBeanDAO.setFechaBaja(new SimpleDateFormat("dd/MM/yyyy")
						.format(new Date()));
			} else {
				usuarioBeanDAO.setFechaBaja(null);
			}
			usuarioDAO.modificar(usuarioBeanDAO);
			return true;
		}
		return false;
	}

	public boolean borrarUsuario(UsuarioView usuario) {
		List<UsuarioBeanDAO> lUsuariosFound = usuarioDAO
				.getUsuarioByName(usuario.getUsername());
		if (lUsuariosFound.size() == 1) {
			usuarioDAO.borrar(lUsuariosFound.iterator().next());
			return true;
		}
		return true;
	}

	public boolean isUsuarioAdmin(UsuarioView usuario) {
		return usuario.getRol().equalsIgnoreCase(USER_ADMIN);
	}

	public boolean isUsuarioProfesor(UsuarioView usuario) {
		return usuario.getRol().equalsIgnoreCase(USER_PROFESOR);
	}

	public boolean isUsuarioAlumno(UsuarioView usuario) {
		return usuario.getRol().equalsIgnoreCase(USER_ALUMNO);
	}

	public IUsuarioDAO getUsuarioDAO() {
		return usuarioDAO;
	}

	public void setUsuarioDAO(IUsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}

}
